package com.yazi.mxz.common.service;

import com.myframework.smhj.common.exception.MyException;
import com.myframework.smhj.hibernate.Searching;
import com.myframework.smhj.hibernate.Page;
import com.myframework.smhj.hibernate.dao.Service;
import com.yazi.mxz.common.entity.beans.Goods;
import com.yazi.mxz.common.entity.beans.Store;
import com.yazi.mxz.common.entity.beans.StoreGoods;
import com.yazi.mxz.common.entity.enums.StoreGoodsStatus;

public interface StoreGoodsService extends Service<StoreGoods> {
	
	/**
	 * 获取同订单的其它在售商品<br>
	 * @param storeGoodsId 商品ID
	 * @param si
	 * @return
	 */
	Page<StoreGoods> listFromSameOrder(long storeGoodsId, Searching si);
	
	/**
	 * 修改店铺商品
	 * @param store 店铺(游离对象)
	 * @param storeGoods 店铺商品(构建对象)
	 * @return
	 */
	StoreGoods editByStore(Store store, StoreGoods storeGoods) throws MyException;

	/**
	 * 添加店铺商品<br>
	 * 以企业商品复制给店铺的方式给店铺添加商品
	 * @param store 店铺(游离对象)
	 * @param goodsIds 企业商品ID(s)
	 */
	void addByStore(Store store, long[] goodsIds) throws MyException;
	
	/**
	 * 添加店铺商品<br>
	 * 将企业商品复制给店铺的方式给店铺添加商品,其中goods必须为完整的游离对象.
	 * @param storeId 店铺ID
	 * @param goods 企业商品(游离对象)
	 * @return
	 */
	StoreGoods addForStore(long storeId, Goods goods);
	
	/**
	 * 	对商品总销量进行统计
	 * */
	void editAllDeal();
	
	/**
	 * 	对商品周销量进行统计
	 * */
	void editWeekDeal();
	
	/**
	 * 	对商品月销量进行统计
	 * */
	void editMonthDeal();
	
	/**
	 * 查询库存大于0的店铺商品
	 * @param sg
	 * @param si
	 * @return
	 */
	Page<StoreGoods> listByStockGtZero(StoreGoods sg, Searching si);
	
	/**
	 * 按编码查询店铺商品
	 * @param sg
	 * @param si
	 * @return
	 */
	Page<StoreGoods> listByBarCodeLike(StoreGoods sg, Searching si);

	/**
	 * 根据企业商品更新相应的店铺商品
	 * @param goodsId 企业商品ID
	 * @param sync 同步字段类型
	 */
	void editByGoodsId(long goodsId, Long sync);

	/**
	 * 更新商品折算库存
	 * @param store 店铺(游离对象)
	 * @param storeGoodsId 商品ID
	 * @param stockConvert 折算库存
	 */
	void editStockConvertByStore(Store store, long storeGoodsId, 
			float stockConvert) throws MyException;

	/**
	 * 商品批量上下架
	 * @param store 店铺(游离对象)
	 * @param storeGoodsIds 商品ID(s)
	 * @param status 目标状态
	 */
	void editStatusByStore(Store store, long[] storeGoodsIds, 
			StoreGoodsStatus status) throws MyException;

	/**
	 * 查询店铺商品<br>
	 * 查询大于sg.updateTime,其它sg属性按等值(eq)查询
	 * @param sg 等值查询条件(除updateTime外)
	 * @param si 分页信息
	 * @return
	 */
	Page<StoreGoods> listByGtUpdateTime(StoreGoods sg, Searching si);

}
